MethodInfo[] allStringMethods = typeOfString.GetMethods(
    BindingFlags.Static |
    BindingFlags.NonPublic |
    BindingFlags.Instance |
    BindingFlags.Public);
MethodInfo[] stringPublicInstanceMethods = typeOfString.GetMethods(
    BindingFlags.Instance |
    BindingFlags.Public);
MethodInfo[] stringPrivateStaticMethods = typeOfString.GetMethods(
    BindingFlags.Static |
    BindingFlags.NonPublic);
foreach (var methodInfo in allStringMethods)
    Console.WriteLine(GetSignatureFromMethodInfo(methodInfo));
// [...]
// Petit helper pour la reconstruction de la signature de la 
// mthode que nous rutiliserons plus tard
static string GetSignatureFromMethodInfo(MethodInfo methodInfo)
{
    return String.Format("{0} {1} {2}{3}({4}){5}",
        (methodInfo.IsPrivate ? "private" : "public") + (methodInfo.IsStatic ? " stat-ic" : ""),
        methodInfo.ReturnType == typeof(void) ? "void" : TypeAsText(methodInfo.ReturnType),
        methodInfo.Name,
        methodInfo.IsGenericMethod
            ? "<" + string.Join(",", methodInfo.GetGenericArguments().OfType<Type>()) + ">"
            : "",
        string.Join(", ", methodInfo.GetParameters().Select(ParameterAsText)),
        methodInfo.IsGenericMethod
            ? Environment.NewLine + "\t" + String.Join(Environment.NewLine + "\t", methodInfo.GetGenericArguments().Select(GenericConstraintAsText))
            : "");
}
 
// Encore un helper : pour construire les contraintes gnriques
static string GenericConstraintAsText(Type genericType)
{
    return string.Format("where {0} : {1}", genericType.Name, string.Join(",", new[]
    {
        genericType.GenericParameterAttributes.HasFlag(GenericParameterAttributes.ReferenceTypeConstraint)? "class": null,
        genericType.GenericParameterAttributes.HasFlag(GenericParameterAttributes.NotNullableValueTypeConstraint)? "struct": null
    }.Concat(genericType.GetGenericParameterConstraints().Where(p =>
        !genericType.GenericParameterAttributes.HasFlag(GenericParameterAttributes.NotNullableValueTypeConstraint) ||
        p != typeof(ValueType)).Select(TypeAsText))
    .Concat(new[]
    {
        genericType.GenericParameterAttributes.HasFlag(GenericParameterAttributes.DefaultConstructorConstraint) &&
        !genericType.GenericParameterAttributes.HasFlag(GenericParameterAttributes.NotNullableValueTypeConstraint)
            ? "new()" : null
    }).Where(s => !string.IsNullOrWhiteSpace(s))));
}
 
// helper
static string ParameterAsText(ParameterInfo p)
{
    return TypeAsText(p.ParameterType) + " " + p.Name;
}
 
// Dernier helper pour la reconstruction textuelle d'un type gnrique
static string TypeAsText(Type type)
{
    return type.IsGenericType
        ? type.GetGenericTypeDefinition().Name.Split('`')[0] + "<" + string.Join(",", type.GetGenericArguments().Select(TypeAsText)) + ">"
        : type.Name;
}
